//package com.inspur.edp.cef.generator.coreGenerator.base.entitygen.method;
//
//import com.inspur.edp.caf.generator.baseInfo.ParameterInfo;
//import com.inspur.edp.caf.generator.baseInfo.TypeInfo;
//import com.inspur.edp.caf.generator.method.ClassMethodGenerator;
//import com.inspur.edp.caf.generator.utils.ExpressionUtils;
//import com.inspur.edp.cef.entity.entity.IEntityData;
//import com.inspur.edp.cef.generator.coreGenerator.base.entitygen.DataTypeImpContext;
//import com.inspur.edp.cef.spi.entity.AbstractPropertyInfo;
//import com.inspur.edp.cef.spi.entity.DefaultValueType;
//import java.math.BigDecimal;
//import java.util.ArrayList;
//import java.util.List;
//import lombok.var;
//import org.eclipse.jdt.core.dom.Block;
//import org.eclipse.jdt.core.dom.CastExpression;
//import org.eclipse.jdt.core.dom.ClassInstanceCreation;
//import org.eclipse.jdt.core.dom.Expression;
//import org.eclipse.jdt.core.dom.MethodInvocation;
//import org.eclipse.jdt.core.dom.Modifier;
//import org.eclipse.jdt.core.dom.Statement;
//import org.eclipse.jdt.core.dom.StringLiteral;
//
//public class AssignDefaultValueGenerator extends ClassMethodGenerator {
//
//  private DataTypeImpContext parentContext;
//  private String nodeCode;
//  private List<AbstractPropertyInfo> propInfos;
//
//  public AssignDefaultValueGenerator(DataTypeImpContext parentContext, String nodeCode) {
//    this.parentContext = parentContext;
//    this.nodeCode = nodeCode;
//    propInfos = parentContext.getParentContext().getProjContext().getCurrentTypeInfo()
//        .getEntityEntityTypeInfos().get(nodeCode).getPropInfos();
//  }
//
//
//  @Override
//  protected String getMethodName() {
//    return "assignDefaultValue";
//  }
//
//  @Override
//  protected TypeInfo getReturnType() {
//    return new TypeInfo(void.class.getTypeName());
//  }
//
//  @Override
//  protected boolean getIsOverride() {
//    return true;
//  }
//
//  @Override
//  protected ArrayList<Modifier.ModifierKeyword> getAccessModifiers() {
//    ArrayList<Modifier.ModifierKeyword> list = new ArrayList<>();
//    list.add(Modifier.ModifierKeyword.PUBLIC_KEYWORD);
//    return list;
//  }
//
//  @Override
//  protected ArrayList<ParameterInfo> getParameterCollection() {
//    ArrayList<ParameterInfo> list = new ArrayList<>();
//    ParameterInfo parameterInfo = new ParameterInfo();
//    parameterInfo.setParamName("data");
//    parameterInfo.setParamType(new TypeInfo(IEntityData.class.getTypeName()));
//    list.add(parameterInfo);
//    return list;
//  }
//
//  @Override
//  protected Block buildMethodBody() {
//    var block = ast.newBlock();
//
//    block.statements().add(getRealDataStatement());
//    addImport(ExpressionUtil.class.getName());
////        block.statements().add(getExpressionUtilStatement());
//    for (var propertyInfo : propInfos) {
//      //TODO 后续支持udt字段、关联字段的默认值
//      if (propertyInfo.getDefaultValue() == null ||
//          propertyInfo.getIsUdt() || propertyInfo.getIsAssociation()) {
//        continue;
//      }
//      if (propertyInfo.getIsEnum()) {
//
//        //    SexEnum.valueOf()
//        addEnumDefaultValue(propertyInfo, block);
//      } else {
//        if (propertyInfo.getDefaultValue().getValueType() == DefaultValueType.Expression) {
//          addExpressionDefaultValue(propertyInfo, block);
//        } else {
//          addNormalDefaultValue(propertyInfo, block);
//        }
//      }
//
//    }
//
//    return block;
//  }
//
//  private Statement getExpressionUtilStatement() {
//
//    var frag = ast.newVariableDeclarationFragment();
//    frag.setName(ast.newSimpleName("expressionUtil"));
//    ClassInstanceCreation classInstanceCreation = ast.newClassInstanceCreation();
//    classInstanceCreation.setType(ast.newSimpleType(ast.newSimpleName("ExpressionUtil")));
//
//    frag.setInitializer(classInstanceCreation);
//    var statement = ast.newVariableDeclarationStatement(frag);
//    statement.setType(ast.newSimpleType(ast.newSimpleName("ExpressionUtil")));
//    addImport(ExpressionUtil.class.getName());
//    return statement;
//  }
//
//  private Statement getRealDataStatement() {
//    String packageName = parentContext.getParentContext()
//        .getProjContext()
//        .getAccessorMediateTypes()
//        .get(nodeCode).getNamespace();
//    String className = parentContext.getParentContext()
//        .getProjContext()
//        .getAccessorMediateTypes()
//        .get(nodeCode).getName();
//
//    var frag = ast.newVariableDeclarationFragment();
//    frag.setName(ast.newSimpleName("realData"));
//    var castExpression = ast.newCastExpression();
//    castExpression.setType(ast.newSimpleType(ast.newSimpleName(className)));
//    castExpression.setExpression(ast.newSimpleName("data"));
//    frag.setInitializer(castExpression);
//    var statement = ast.newVariableDeclarationStatement(frag);
//    statement.setType(ast.newSimpleType(ast.newSimpleName(className)));
//
//    return statement;
//  }
//
//  private void addEnumDefaultValue(AbstractPropertyInfo propertyInfo, Block block) {
//    //    SexEnum.valueOf()
////        String packageName = parentContext.getParentContext().getProjContext().getEntityContext().getMainInterfaceType().getBaseInterfate().getPackage().getName();
////        var typeName = propertyInfo.getName() + "Enum";
//    Class dataType = null;
//    if ("RootNode".equals(nodeCode)) {
//      dataType = parentContext.getParentContext().getProjContext().getEntityContext()
//          .getMainInterfaceType().getBaseInterfate();
//    } else {
//      dataType = parentContext.getParentContext().getChildInterfaceTypes().get(nodeCode)
//          .getBaseInterfate();
//    }
//    String typeName = null;
//    try {
//      typeName = dataType.getMethod("get" + propertyInfo.getName()).getReturnType().getTypeName();
//    } catch (NoSuchMethodException e) {
//      throw new RuntimeException("没有找到枚举类属性" + propertyInfo.getName());
//    }
//
//    var invocation = ast.newMethodInvocation();
//    invocation.setName(ast.newSimpleName("valueOf"));
//    invocation.setExpression(ast.newName(typeName));
//    invocation.arguments().add(ExpressionUtils
//        .getStringLiteral(ast, propertyInfo.getDefaultValue().getRealValue().toString()));
////        Expression invocation = getRealValueInvocation(propertyInfo);
//
//    var setInvocation = ExpressionUtils
//        .getMethodInvocation(ast, "realData", "set" + propertyInfo.getName());
//
//    setInvocation.arguments().add(invocation);
//    block.statements().add(ast.newExpressionStatement(setInvocation));
//
//  }
//
//  private void addNormalDefaultValue(AbstractPropertyInfo propertyInfo, Block block) {
//    Expression invocation = getRealValueInvocation(propertyInfo);
//
//    var setInvocation = ExpressionUtils
//        .getMethodInvocation(ast, "realData", "set" + propertyInfo.getName());
//
//    setInvocation.arguments().add(invocation);
//    block.statements().add(ast.newExpressionStatement(setInvocation));
//  }
//
//  private void addExpressionDefaultValue(AbstractPropertyInfo propertyInfo, Block block) {
//    Expression invocation = getExpressionValueInvocation(propertyInfo);
//
//    var setInvocation = ExpressionUtils
//        .getMethodInvocation(ast, "realData", "set" + propertyInfo.getName());
//
//    setInvocation.arguments().add(invocation);
//    block.statements().add(ast.newExpressionStatement(setInvocation));
//  }
//
//  private Expression getRealValueInvocation(AbstractPropertyInfo propertyInfo) {
//    Expression convertInvocation;
//
//    switch (propertyInfo.getType()) {
//      case Integer:
//        convertInvocation = getConvertIntSyntax(propertyInfo);
//        break;
//      case Decimal:
//        convertInvocation = getConvertDecimalSyntax(propertyInfo);
//        break;
//      case Boolean:
//        convertInvocation = getConvertBoolSyntax(propertyInfo);
//        break;
//      case Date:
//        convertInvocation = getConvertDateSyntax(propertyInfo);
//        break;
//      case DateTime:
//        convertInvocation = getConvertDateTimeSyntax(propertyInfo);
//        break;
//      default:
//        return getDefault(propertyInfo);
//    }
//
//    return convertInvocation;
//  }
//
//  private CastExpression getExpressionValueInvocation(AbstractPropertyInfo propertyInfo) {
//
//    MethodInvocation methodInvocation = ast.newMethodInvocation();
//    methodInvocation.setExpression(ast.newSimpleName("ExpressionUtil"));
//    methodInvocation.setName(ast.newSimpleName("getExpressionValue"));
//    StringLiteral stringLiteral = ast.newStringLiteral();
//    stringLiteral.setLiteralValue(propertyInfo.getDefaultValue().getValue());
//    methodInvocation.arguments().add(stringLiteral);
//
//    CastExpression castExpression = ast.newCastExpression();
//    castExpression.setExpression(methodInvocation);
//    switch (propertyInfo.getType()) {
//      case Integer:
//        addImport(Integer.class.getName());
//        castExpression.setType(ast.newSimpleType(ast.newSimpleName("Integer")));
//        break;
//      case Decimal:
////                addImport(Decimal.class.getName());
//        castExpression.setType(ast.newSimpleType(ast.newSimpleName("Decimal")));
//        break;
//      case Boolean:
//        addImport(Boolean.class.getName());
//        castExpression.setType(ast.newSimpleType(ast.newSimpleName("Boolean")));
//        break;
//      case Date:
////                addImport(Date.class.getName());
//////                castExpression.setType(ast.newSimpleType(ast.newSimpleName("Date")));
//////                break;
//      case DateTime:
//        addImport(java.util.Date.class.getName());
//        castExpression.setType(ast.newSimpleType(ast.newSimpleName("Date")));
//        break;
//      default:
//        castExpression.setType(ast.newSimpleType(ast.newSimpleName("String")));
//        break;
//    }
//
//    return castExpression;
//  }
//
//  private Expression getConvertDateSyntax(AbstractPropertyInfo propertyInfo) {
//    var invocation = ast.newMethodInvocation();
//    invocation.setName(ast.newSimpleName("getDateValue"));
//    invocation.arguments().add(
//        ExpressionUtils.getStringLiteral(ast, propertyInfo.getDefaultValue().getValue()));
//    return invocation;
//  }
//
//  private Expression getConvertDateTimeSyntax(AbstractPropertyInfo propertyInfo) {
//    var invocation = ast.newMethodInvocation();
//    invocation.setName(ast.newSimpleName("getDateTimeValue"));
//    invocation.arguments().add(
//        ExpressionUtils.getStringLiteral(ast, propertyInfo.getDefaultValue().getValue()));
//    return invocation;
//  }
//
//  private Expression getConvertDecimalSyntax(AbstractPropertyInfo propertyInfo) {
//    var creation = ast.newClassInstanceCreation();
//    creation.setType(new TypeInfo(BigDecimal.class).getType(ast,
//        parentContext.getParentContext().getProjContext().getRootCompileUnitGenCtx()));
//    creation.arguments().add(
//        ExpressionUtils.getStringLiteral(ast, propertyInfo.getDefaultValue().getValue()));
//    return creation;
//  }
//
//  private Expression getConvertBoolSyntax(AbstractPropertyInfo propertyInfo) {
//    return ast.newBooleanLiteral((Boolean) propertyInfo.getDefaultValue().getRealValue());
//  }
//
//  private Expression getConvertIntSyntax(AbstractPropertyInfo propertyInfo) {
//    return ast.newNumberLiteral(propertyInfo.getDefaultValue().getRealValue().toString());
//  }
//
//  private Expression getDefault(AbstractPropertyInfo propertyInfo) {
//    return ExpressionUtils
//        .getStringLiteral(ast, (String) propertyInfo.getDefaultValue().getRealValue());
//  }
//}